﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using ServicioComunitario2.Logica.Clases;
using ServicioComunitario2.Logica.Excepciones;
using ServicioComunitario2.EnlaceDatos;


namespace ServicioComunitario2.EnlaceDatos.SqlServer
{
    public class SqlEvento
    {
        #region Insertar Evento


        public bool InsertarEvento(Evento _miEvento)
        {

            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();


            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                //se introducen los datos de la conexion y el nombre del stored procedure a utilizar
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[AgregarEvento]";
                command.CommandTimeout = 10;

                //Se introducen los parametros del stored procedure
                command.Parameters.AddWithValue("@nombreEve", _miEvento.NombreEvento);
                command.Parameters.AddWithValue("@fechaEve", _miEvento.FechaEvento);
                command.Parameters.AddWithValue("@sitioEve", _miEvento.SitioEvento);
                command.Parameters.AddWithValue("@responsableEve", _miEvento.ResponsableEvento);
                command.Parameters.AddWithValue("@descripcionEve", _miEvento.DescripcionEvento);
                command.Parameters.AddWithValue("@statusEve", _miEvento.StatusEvento);
                command.Parameters.AddWithValue("@personaEve", _miEvento.AutorEvento);

                command.Parameters["@nombreEve"].Direction = ParameterDirection.Input;
                command.Parameters["@fechaEve"].Direction = ParameterDirection.Input;
                command.Parameters["@sitioEve"].Direction = ParameterDirection.Input;
                command.Parameters["@responsableEve"].Direction = ParameterDirection.Input;
                command.Parameters["@descripcionEve"].Direction = ParameterDirection.Input;
                command.Parameters["@statusEve"].Direction = ParameterDirection.Input;
                command.Parameters["@personaEve"].Direction = ParameterDirection.Input;

                // se ejecuta el comando, se ejecuta el stored procedure InsertarEscuela
                command.ExecuteReader();

                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception e)
            {
                return false;
            }

             //se cierra la conexion una vez ejecutado el comando.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }

        public Evento DetalleEvento(int _miEventoId)
        {

            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;

            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                //se introducen los datos de la conexion y el nombre del stored procedure a utilizar
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[DetallesEvento]";
                command.CommandTimeout = 10;

                //Se introducen los parametros del stored procedure
                command.Parameters.AddWithValue("@idEvento", _miEventoId);

                Evento evento = new Evento();
                reader = command.ExecuteReader();

                if (reader.Read())
                {
                    evento.IdEvento = reader.GetInt32(0);
                    evento.NombreEvento = reader.GetString(1);
                    evento.FechaEvento = reader.GetDateTime(2);
                    evento.SitioEvento = reader.GetString(3);
                    evento.ResponsableEvento = reader.GetString(4);
                    evento.DescripcionEvento = reader.GetString(5);
                    evento.StatusEvento = reader.GetString(6);
                }
                return evento;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception e)
            {
                return null;
            }

             //se cierra la conexion una vez ejecutado el comando.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }

        public bool ModificarEvento(Evento _miEvento, int _miEventoId)
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();

            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                //se introducen los datos de la conexion y el nombre del stored procedure a utilizar
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ModificarEvento]";
                command.CommandTimeout = 10;

                //Se introducen los parametros del stored procedure
                command.Parameters.AddWithValue("@nombreEve", _miEvento.NombreEvento);
                command.Parameters.AddWithValue("@fechaEve", _miEvento.FechaEvento);
                command.Parameters.AddWithValue("@sitioEve", _miEvento.SitioEvento);
                command.Parameters.AddWithValue("@responsableEve", _miEvento.ResponsableEvento);
                command.Parameters.AddWithValue("@descripcionEve", _miEvento.DescripcionEvento);
                command.Parameters.AddWithValue("@numEve", _miEventoId);

                command.Parameters["@nombreEve"].Direction = ParameterDirection.Input;
                command.Parameters["@fechaEve"].Direction = ParameterDirection.Input;
                command.Parameters["@sitioEve"].Direction = ParameterDirection.Input;
                command.Parameters["@responsableEve"].Direction = ParameterDirection.Input;
                command.Parameters["@descripcionEve"].Direction = ParameterDirection.Input;
                command.Parameters["@numEve"].Direction = ParameterDirection.Input;

                // se ejecuta el comando, se ejecuta el stored procedure InsertarEscuela
                command.ExecuteReader();

                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception e)
            {
                return false;
            }

             //se cierra la conexion una vez ejecutado el comando.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }

        public bool SuspenderEvento(int _miEventoId)
        {

            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();


            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                //se introducen los datos de la conexion y el nombre del stored procedure a utilizar
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SuspenderEvento]";
                command.CommandTimeout = 10;

                //Se introducen los parametros del stored procedure
                command.Parameters.AddWithValue("@statusEve", "suspendido");
                command.Parameters.AddWithValue("@idEve", _miEventoId);

                command.Parameters["@statusEve"].Direction = ParameterDirection.Input;
                command.Parameters["@idEve"].Direction = ParameterDirection.Input;

                // se ejecuta el comando, se ejecuta el stored procedure InsertarEscuela
                command.ExecuteReader();

                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception e)
            {
                return false;
            }

             //se cierra la conexion una vez ejecutado el comando.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }

        public bool ListarEventosMes(Evento _miEvento, int _miEventoMes)
        {

            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();

            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                //se introducen los datos de la conexion y el nombre del stored procedure a utilizar
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ListarEventosMes]";
                command.CommandTimeout = 10;

                //Se introducen los parametros del stored procedure
                command.Parameters.AddWithValue("@mes", _miEventoMes);

                command.Parameters["@mes"].Direction = ParameterDirection.Input;

                // se ejecuta el comando, se ejecuta el stored procedure InsertarEscuela
                command.ExecuteReader();

                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception e)
            {
                return false;
            }

             //se cierra la conexion una vez ejecutado el comando.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }

        public bool ListarEventosTodos(Evento _miEvento)
        {

            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();


            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                //se introducen los datos de la conexion y el nombre del stored procedure a utilizar
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ListarEventosPersona]";
                command.CommandTimeout = 10;

                // se ejecuta el comando, se ejecuta el stored procedure InsertarEscuela
                command.ExecuteReader();

                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception e)
            {
                return false;
            }

             //se cierra la conexion una vez ejecutado el comando.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }

        public List<Evento> ListarTodosEventos()
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<Evento> miListaEvento = new List<Evento>();

            try
            {
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ListarEventos]";
                command.CommandTimeout = 10;
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Evento miEvento = new Evento();
                    miEvento.IdEvento = reader.GetInt32(0);
                    miEvento.FechaEvento = reader.GetDateTime(1);
                    miEvento.NombreEvento = reader.GetString(2);
                    miEvento.ResponsableEvento = reader.GetString(3);

                    miListaEvento.Add(miEvento);
                }

                return miListaEvento;

            }
            catch (SqlException)
            {
                return miListaEvento;
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }


        }

        public List<Evento> ListarTodosEventos(int numPersona)
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<Evento> miListaEvento = new List<Evento>();

            try
            {
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ListarEventosPersona]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idPersona", numPersona);
                command.Parameters["@idPersona"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Evento miEvento = new Evento();
                    miEvento.IdEvento = reader.GetInt32(0);
                    miEvento.FechaEvento = reader.GetDateTime(1);
                    miEvento.NombreEvento = reader.GetString(2);
                    miEvento.ResponsableEvento = reader.GetString(3);

                    miListaEvento.Add(miEvento);
                }

                return miListaEvento;

            }
            catch (SqlException)
            {
                return miListaEvento;
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }


        }

        #endregion Final de la funcion InsertarEvento
    }
}